package com.gitee.wsl.ext.string


/**
 * 通过重复quote字符来对quote字符实现转义。例如 a`b得到 `a``b`
 *
 * @param str   字符串
 * @param quote 引用字符
 * @return 为字符串前后增加quote字符，并对字符串内部的quote字符进行转义。
 */
fun quoteDupEscapeString(str: String?, quote: Char): String? {
    if (str == null) return null
    if (str.isEmpty()) return quote.toString() + quote

    if (str.indexOf(quote) < 0) {
        return quote.toString() + str + quote
    }
    val sb = StringBuilder(str.length + 5)
    sb.append(quote)
    var i = 0
    val n = str.length
    while (i < n) {
        val c = str.get(i)
        if (c == quote) {
            sb.append(quote)
            sb.append(quote)
        } else {
            sb.append(c)
        }
        i++
    }
    sb.append(quote)
    return sb.toString()
}

/**
 * 如果发现指定字符，则把该字符重复一遍。例如 a'b --> a''b
 */

fun encodeDupEscape(str: String?, c: Char): String? {
    if (str == null) return null
    if (str.isEmpty()) return str

    if (str.indexOf(c) < 0) {
        return str
    }
    val sb = StringBuilder(str.length + 5)
    var i = 0
    val n = str.length
    while (i < n) {
        val cc = str.get(i)
        if (cc == c) {
            sb.append(c)
            sb.append(c)
        } else {
            sb.append(cc)
        }
        i++
    }
    return sb.toString()
}


fun decodeDupEscape(str: String?, c: Char): String? {
    if (str == null) return null
    if (str.isEmpty()) return str

    if (str.indexOf(c) < 0) {
        return str
    }
    val sb = StringBuilder(str.length + 5)
    var i = 0
    val n = str.length
    while (i < n) {
        val cc = str.get(i)
        sb.append(cc)
        if (cc == c) {
            if (i < n - 1 && str.get(i + 1) == c) {
                i++
            }
        }
        i++
    }
    return sb.toString()
}

/**
 * 假设第一个字符和最后一个字符是quote字符，对字符串进行反转义处理。 例如 `a``b`得到 a`b
 *
 * @param str 字符串
 * @return 反转义得到的字符串。
 */

fun unquoteDupEscapeString(str: String?): String? {
    if (str == null || str.length < 2) {
        return str
    }
    var buf :StringBuilder? = null
    val quote = str.get(0)
    if (quote != str.get(str.length - 1)) {
        throw Exception(str)
    }
    val len = str.length - 2
    var i: Int = 1
    while (i < len) {
        var ch = str.get(i)
        if (ch == quote) {
            val j = i
            i++
            ch = str.get(i)
            if (ch != quote) {
                i++
                continue
            }

            if (buf == null) {
                buf = StringBuilder(len)
                if (j > 0) {
                    buf.append(str, 1, j)
                }
            }
            buf.append(ch)
        } else if (buf != null) {
            buf.append(ch)
        }
        i++
    }
    if (buf != null) {
        if (i == len) buf.append(str.get(len))
        return buf.toString()
    }
    return str.substring(1, str.length - 1)
}